/*
 * Copyright (c) 2018 Zilliqa
 * This source code is being disclosed to you solely for the purpose of your
 * participation in testing Zilliqa. You may view, compile and run the code for
 * that purpose and pursuant to the protocols and algorithms that are programmed
 * into, and intended by, the code. You may not do anything else with the code
 * without express permission from Zilliqa Research Pte. Ltd., including
 * modifying or publishing the code (or any part of it), and developing or
 * forming another public or private blockchain network. This source code is
 * provided 'as is' and no warranties are given as to title or non-infringement,
 * merchantability or fitness for purpose and, to the extent permitted by law,
 * all liability for your use of the code is disclaimed. Some programs in this
 * code are governed by the GNU General Public License v3.0 (available at
 * https://www.gnu.org/licenses/gpl-3.0.en.html) ('GPLv3'). The programs that
 * are governed by GPLv3.0 are those programs that are located in the folders
 * src/depends and tests/depends and which include a reference to GPLv3 in their
 * program files.
 */

#ifndef __SYSCOMMAND_H__
#define __SYSCOMMAND_H__

#include <signal.h>
#include <array>
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <memory>
#include <string>

#include "Logger.h"

class SysCommand {
 public:
  static bool ExecuteCmdWithoutOutput(std::string cmd) {
    std::string str;
    return ExecuteCmdWithOutput(cmd, str);
  }

  static bool ExecuteCmdWithOutput(std::string cmd, std::string& output) {
    LOG_MARKER();

    std::array<char, 128> buffer;

    signal(SIGCHLD, SIG_IGN);

    // Log the stderr into stdout as well
    cmd += " 2>&1 ";
    std::unique_ptr<FILE, decltype(&pclose)> proc(popen(cmd.c_str(), "r"),
                                                  pclose);
    if (!proc) {
      LOG_GENERAL(WARNING, "popen() failed!");
      return false;
    }
    while (!feof(proc.get())) {
      if (fgets(buffer.data(), 128, proc.get()) != nullptr) {
        output += buffer.data();
      }
    }

    return true;
  }
};

#endif  // __SYSCOMMAND_H__
